# 1. 最低CMake版本要求（兼容大部分系统）
cmake_minimum_required(VERSION 4.0)

# 2. 项目名称、版本、描述（静态库名称：modbus_framework）
project(modbus_framework
        VERSION 1.0
        DESCRIPTION "Modbus INI Template Static Library"
        LANGUAGES C
)

# 3. 设置C标准（C99，兼容旧编译器）
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
#set(CMAKE_CXX_STANDARD 20)

# 4. 编译选项（开启警告、优化级别O2）
add_compile_options(
        -Wall        # 开启所有警告
        -Wextra      # 额外警告
        -O2          # 优化级别O2
        -fPIC        # 生成位置无关代码（静态库可选，增强兼容性）
)

# 5. 查找依赖库（libmodbus + iniparser）
# 5.1 查找libmodbus（优先用pkg-config，兼容系统安装）
find_package(PkgConfig REQUIRED)
set(CMAKE_FIND_LIBRARY_SUFFIXES .so .so.5)  # 动态库后缀
pkg_check_modules(MODBUS REQUIRED libmodbus)
if(NOT MODBUS_FOUND)
    message(FATAL_ERROR "libmodbus library not found! Please install libmodbus-dev.")
endif()

# 5.2 查找iniparser（部分系统无pkg-config，手动查找头文件和库）
find_path(INIPARSER_INCLUDE_DIR NAMES iniparser.h)
find_library(INIPARSER_LIBRARY NAMES iniparser)
if(NOT INIPARSER_INCLUDE_DIR OR NOT INIPARSER_LIBRARY)
    message(FATAL_ERROR "iniparser library not found! Please install libiniparser-dev.")
endif()

# 6. 构建静态库（库名称：modbus_framework，源文件为src下的核心文件）
add_library(${PROJECT_NAME} STATIC
        src/m_modbus_pnp.c
        src/m_modbus_tml.c
        src/s_modbus_rtu.c
        src/common_log.c
)

# 7. 配置静态库的头文件包含目录（对外暴露include目录）
target_include_directories(${PROJECT_NAME}
        PUBLIC
        $<INSTALL_INTERFACE:inc>  # 安装后外部项目的包含路径
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/inc>  # 构建时的包含路径
        PRIVATE
        ${MODBUS_INCLUDE_DIRS}        # 依赖库的私有头文件（仅库内部使用）
        ${INIPARSER_INCLUDE_DIR}
)

# 8. 链接依赖库
target_link_libraries(${PROJECT_NAME}
        PRIVATE
        ${MODBUS_LIBRARIES}
        ${INIPARSER_LIBRARY}
)

# 9. 构建可执行程序（测试用，可选，名称：modbus_slave_app）
add_executable(${PROJECT_NAME}_app
        src/s_main.c
)

# 10. 配置可执行程序的依赖（链接依赖库）
target_link_libraries(${PROJECT_NAME}_app
        PRIVATE
        ${PROJECT_NAME}  # 链接自身构建的静态库
        ${MODBUS_LIBRARIES}
        ${INIPARSER_LIBRARY}
)

# 11. 安装规则（可选，支持make install安装到系统目录）
install(
        TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_app
        EXPORT ${PROJECT_NAME}_Targets
        ARCHIVE DESTINATION lib  # 静态库安装到/usr/local/lib
        RUNTIME DESTINATION bin  # 可执行程序安装到/usr/local/bin
)

# 安装头文件（到/usr/local/include）
install(
        DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/
        DESTINATION include
)

# 安装配置文件（可选，到/usr/local/share/${PROJECT_NAME}）
install(
        DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/config/
        DESTINATION share/${PROJECT_NAME}/config
)

# 12. 导出CMake配置文件（可选，方便外部项目通过find_package查找）
install(
        EXPORT ${PROJECT_NAME}_Targets
        FILE ${PROJECT_NAME}Config.cmake
        DESTINATION lib/cmake/${PROJECT_NAME}
)
